﻿## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##     http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.

function CreateHealthServicesFromWatcherNodesList($discoveryData, $watcherNodes) {
    $healthServices = @()
    foreach ($watcherNodeName in $WatcherNodes.Split(';', [StringSplitOptions]::RemoveEmptyEntries)) {
        $healthServices += CreateHealthService $discoveryData $watcherNodeName
    }
    return ,$healthServices
}

function CreateHealthService($discoveryData, $computerName) {
    $healthService = $discoveryData.CreateClassInstance("$MPElement[Name="SC!Microsoft.SystemCenter.HealthService"]$")
    $healthService.AddProperty("$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$", $computerName)
    $healthService
}

function AddManagementRelationship($discoveryData, $healthServices, [string]$targetName, $target) {
    $relationship = $discoveryData.CreateRelationshipInstance("$MPElement[Name="SC!Microsoft.SystemCenter.HealthServiceShouldManageEntity"]$")
    $relationship.Source = $healthServices[(GetHash $targetName) % $healthServices.Count]
    $relationship.Target = $target
    $discoveryData.AddInstance($relationship)
}

# TODO: Concider replacing this with MurMur-based consistent hashing?
# For instance, based on few runs - this provides better distribution, then standard GetHashCode(), and do we care about consistency at all?
function GetHash([Char[]]$s) { # Linear Congruential Generator
    $s+([UInt64]$r=0)|%{$r=($r*[UInt32]0x8EF6E7+$_-band[UInt32]::MaxValue)%0x7FFFFFFF};$r
}
